package cn.kgc.utils;

import cn.kgc.config.AlipayConfig;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.kernel.util.ResponseChecker;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component // 不加这个会报错
public class AlipayUtil {

    private final AlipayConfig alipayConfig;

    public AlipayUtil(AlipayConfig alipayConfig) {
        this.alipayConfig = alipayConfig;
    }

    public String aliPagePay(String modelName, String payNo, String totalAmount) {
        String result = "";
        // 1. 设置参数（全局只需设置一次）
        Factory.setOptions(getOptions());
        try {
            // 2. 发起API调用
            /**
             * 第一个参数Subject：商品名称
             * 第二个参数outTradeNo：编号 - 使用支付编号，业务比较简单，也可以直接使用订单编号
             * 第三个参数totalAmount：支付的总金额
             * 第四个参数resultUrl: 用户成功支付之后，跳转的页面
             */
            AlipayTradePagePayResponse response = Factory.Payment.Page()
                    .pay(modelName, payNo, totalAmount, alipayConfig.getReturnUrl());
            // 3. 处理响应或异常
            if (ResponseChecker.success(response)) {
                result = response.body;
                System.out.println("调用成功:" + response.body);
            } else {
                System.err.println("调用失败，原因：" + response.body);
            }
        } catch (Exception e) {
            System.err.println("调用遭遇异常，原因：" + e.getMessage());
            throw new RuntimeException(e.getMessage(), e);
        }

        return result;
    }

    private Config getOptions() {
        Config config = new Config();
        config.protocol = alipayConfig.getProtocol(); // 协议
        config.gatewayHost = alipayConfig.getGatewayHost(); // 网关地址
        config.signType = alipayConfig.getSignType();
        config.appId = alipayConfig.getAppId();

        // 为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
        // 注意这个私钥，是自己的私钥
        config.merchantPrivateKey = alipayConfig.getMerchantPrivateKey();
        //注：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
        config.alipayPublicKey = alipayConfig.getAlipayPublicKey();
        return config;
    }

}
